#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
using namespace std;

// int main()
// {
//     int a = 10;
//     int b = 0;
//     a /= b;

//     pid_t id = fork();
//     if(id == 0)
//     {
//         int cnt = 200;
//         while(cnt--)
//         {
//             cout << "child process, pid = " << getpid() << " cnt = " << cnt << endl;
//             sleep(1);
//         }
//         exit(1);
//     }
//     int status = 0;
//     pid_t ret = waitpid(id, &status, 0);
//     if(ret == -1)
//     {
//         cout << "wait error" << endl;
//         exit(2);
//     }
//     cout << "wait success, ret = " << ret << ", signal code: " << ((status >> 8) & 0xFF) <<\
//      ", exit signal: " << (status & 0x7f) << ", core dump: "<< ((status >> 7) & 1) << endl;

//     return 0;
// }


void handler(int signo)
{
    cout << "get signo: " << signo << endl;
    unsigned int n = alarm(5);
    cout << "剩余时间：" << n << endl;
}

// void handler(int signo)
// {
//     cout << "get signo: " << signo << " pid = " << getpid() << endl;
// }

int main()
{
    signal(SIGALRM, handler);
    alarm(50);
    while(true)
    {
        cout << "this process pid: " << getpid() << endl;
        sleep(1);
    }


    // cout << "error before" << endl;
    // sleep(1);

    // // char buff[1024];
    // // int n = read(4, buff, sizeof(buff));
    // // cout << n << endl;
    // // perror("read");

    // signal(SIGSEGV, handler);
    // int* p = nullptr;
    // *p = 10;

    // // int a = 10;
    // // a /= 0;
    // cout << "error after" << endl;

    return 0;
}